#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>  // 控制终端模式
#include <unistd.h>
#include "common.h"


void press_any_key(void)
{
	printf("\n请按任意键返回...\n");

        // 关闭终端行缓冲功能和回显
        system("stty -icanon -echo");  // 调用命令
        getchar();  // 等待字符输入
        // 恢复终端行缓冲功能和回显
        system("stty icanon echo");  // 调用命令

}


void get_password(char *password, int max_length)
{
    // 保存旧的终端设置
    struct termios old_term, new_term;  // 结构体，包含终端的各种属性设置
    tcgetattr(STDIN_FILENO, &old_term);  // 将终端属性保存到 old_term 结构体中
    new_term = old_term;  // 复制旧的设置到新的设置中

    // 禁用回显(ECHO)和规范模式(ICANON)
    new_term.c_lflag &= ~(ECHO | ICANON);  // &= ~ECHO 的作用是清除 ECHO 位,从而禁用回显; &= ~ICANON 的作用是清除 ICANON 位，从而禁用规范模式
    tcsetattr(STDIN_FILENO, TCSANOW, &new_term);  // 设置终端参数，TCSANOW 表示立即生效，这行代码执行后，终端将不再回显输入的字符

    int i = 0;
    char ch;

    fflush(stdout); // 确保提示信息被打印出来

    while (i < max_length - 1) // 为'\0'留出空间
    {
        ch = getchar();

        // 如果遇到回车或换行，输入结束
        if (ch == '\n' || ch == '\r')
        {
            break;
        }
        // 处理退格键 (Backspace)
        else if (ch == '\b' || ch == 127) // 127是ASCII码的DEL，在某些系统上代表退格
        {
            if (i > 0)
            {
                i--;
                printf("\b \b"); // 光标回退一格，打印空格覆盖*，再回退一格
                fflush(stdout);
            }
        }
        else
        {
            // 存储字符并打印*
            password[i++] = ch;  
            printf("*");
            fflush(stdout);
        }
    }

    // 为密码字符串添加结束符
    password[i] = '\0';  // // 在字符数组的末尾添加字符串结束符，使其成为一个合法的C语言字符串
    printf("\n");

    // 恢复旧的终端设置
    tcsetattr(STDIN_FILENO, TCSANOW, &old_term);
}